#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
数据库完整设置脚本
包含数据库迁移、初始化数据、创建测试数据等功能
"""

import os
import sys
import django
from django.core.management import call_command

# 设置Django环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'TradingPlatform_Server.settings')
django.setup()

from django.contrib.auth.hashers import make_password
from Server.models import Kind, User, Store, Takeout
from Server.enum import StoreState, TakeoutState


def print_header(text):
    """打印标题"""
    print("\n" + "=" * 60)
    print(text.center(60))
    print("=" * 60)


def print_step(step_num, text):
    """打印步骤"""
    print(f"\n【步骤 {step_num}】{text}")
    print("-" * 60)


def check_database_file():
    """检查数据库文件是否存在"""
    db_path = 'db.sqlite3'
    if os.path.exists(db_path):
        print(f"✓ 数据库文件存在: {db_path}")
        file_size = os.path.getsize(db_path)
        print(f"  文件大小: {file_size} 字节")
        return True
    else:
        print(f"✗ 数据库文件不存在: {db_path}")
        return False


def create_migrations():
    """创建迁移文件"""
    print("正在生成迁移文件...")
    try:
        call_command('makemigrations', verbosity=1)
        print("✓ 迁移文件生成成功")
    except Exception as e:
        print(f"✗ 生成迁移文件失败: {e}")
        return False
    return True


def run_migrations():
    """执行数据库迁移"""
    print("正在执行数据库迁移...")
    try:
        call_command('migrate', verbosity=1)
        print("✓ 数据库迁移完成")
    except Exception as e:
        print(f"✗ 数据库迁移失败: {e}")
        return False
    return True


def init_kinds():
    """初始化外卖分类"""
    print("正在初始化外卖分类...")
    
    kinds_data = [
        {'type': '中餐', 'content': '传统中式美食'},
        {'type': '西餐', 'content': '西式快餐和料理'},
        {'type': '日韩料理', 'content': '日本和韩国料理'},
        {'type': '小吃', 'content': '各种特色小吃'},
        {'type': '甜品饮品', 'content': '甜品、奶茶、咖啡等'},
        {'type': '火锅烧烤', 'content': '火锅和烧烤类'},
        {'type': '快餐', 'content': '快餐便当类'},
        {'type': '其他', 'content': '其他美食分类'},
    ]
    
    created_count = 0
    existing_count = 0
    
    for kind_data in kinds_data:
        kind, created = Kind.objects.get_or_create(
            type=kind_data['type'],
            defaults={'content': kind_data['content']}
        )
        if created:
            print(f"  ✓ 创建分类: {kind.type} - {kind.content}")
            created_count += 1
        else:
            print(f"  ○ 分类已存在: {kind.type}")
            existing_count += 1
    
    total = Kind.objects.count()
    print(f"\n  总计: 新建 {created_count} 个, 已存在 {existing_count} 个, 共 {total} 个分类")
    return True


def init_admin_user():
    """初始化管理员用户"""
    print("正在初始化管理员用户...")
    
    admin_id = 'admin001'
    admin_data = {
        'username': '系统管理员',
        'password': make_password('admin123'),
        'phone': '13800138000',
        'is_admin': True,
        'money': 10000.0
    }
    
    try:
        admin, created = User.objects.get_or_create(
            id=admin_id,
            defaults=admin_data
        )
        
        if created:
            print(f"  ✓ 管理员账号创建成功")
            print(f"    用户ID: {admin.id}")
            print(f"    用户名: {admin.username}")
            print(f"    手机号: {admin.phone}")
            print(f"    密码: admin123")
            print(f"    余额: {admin.money}")
        else:
            print(f"  ○ 管理员账号已存在")
            print(f"    用户ID: {admin.id}")
            print(f"    用户名: {admin.username}")
    except Exception as e:
        print(f"  ✗ 创建管理员失败: {e}")
        return False
    
    return True


def create_test_users():
    """创建测试用户"""
    print("正在创建测试用户...")
    
    test_users = [
        {
            'id': 'user001',
            'username': '张三',
            'phone': '13912345678',
            'password': make_password('12345678'),
            'money': 500.0
        },
        {
            'id': 'user002',
            'username': '李四',
            'phone': '13912345679',
            'password': make_password('12345678'),
            'money': 300.0
        },
        {
            'id': 'user003',
            'username': '王五',
            'phone': '13912345680',
            'password': make_password('12345678'),
            'money': 200.0
        }
    ]
    
    created_count = 0
    existing_count = 0
    
    for user_data in test_users:
        try:
            user, created = User.objects.get_or_create(
                id=user_data['id'],
                defaults=user_data
            )
            if created:
                print(f"  ✓ 创建用户: {user.username} (ID: {user.id}, 手机: {user.phone})")
                created_count += 1
            else:
                print(f"  ○ 用户已存在: {user.username} (ID: {user.id})")
                existing_count += 1
        except Exception as e:
            print(f"  ✗ 创建用户失败 {user_data['id']}: {e}")
    
    print(f"\n  总计: 新建 {created_count} 个, 已存在 {existing_count} 个测试用户")
    return True


def create_test_stores():
    """创建测试商家"""
    print("正在创建测试商家...")
    
    # 先检查用户是否存在
    try:
        user1 = User.objects.get(id='user001')
        user2 = User.objects.get(id='user002')
    except User.DoesNotExist:
        print("  ✗ 请先创建测试用户")
        return False
    
    test_stores = [
        {
            'id': 'store001',
            'store_name': '美味餐厅',
            'address': '校园东区美食街1号',
            'user': user1,
            'state': StoreState.audited.value,
            'introduce': '提供各种美味的中式餐饮'
        },
        {
            'id': 'store002',
            'store_name': '快餐小铺',
            'address': '校园西区商业街2号',
            'user': user2,
            'state': StoreState.audited.value,
            'introduce': '快捷方便的快餐服务'
        }
    ]
    
    created_count = 0
    existing_count = 0
    
    for store_data in test_stores:
        try:
            store, created = Store.objects.get_or_create(
                id=store_data['id'],
                defaults=store_data
            )
            if created:
                print(f"  ✓ 创建商家: {store.store_name} (ID: {store.id})")
                created_count += 1
            else:
                print(f"  ○ 商家已存在: {store.store_name} (ID: {store.id})")
                existing_count += 1
        except Exception as e:
            print(f"  ✗ 创建商家失败 {store_data['id']}: {e}")
    
    print(f"\n  总计: 新建 {created_count} 个, 已存在 {existing_count} 个测试商家")
    return True


def show_database_stats():
    """显示数据库统计信息"""
    print("\n数据库统计信息:")
    print("-" * 60)
    
    try:
        user_count = User.objects.count()
        admin_count = User.objects.filter(is_admin=True).count()
        store_count = Store.objects.count()
        kind_count = Kind.objects.count()
        takeout_count = Takeout.objects.count()
        
        print(f"  用户总数: {user_count} (管理员: {admin_count})")
        print(f"  商家总数: {store_count}")
        print(f"  外卖总数: {takeout_count}")
        print(f"  分类总数: {kind_count}")
    except Exception as e:
        print(f"  ✗ 获取统计信息失败: {e}")


def main():
    """主函数"""
    print_header("交易平台数据库设置向导")
    
    print("\n本向导将帮助您完成以下任务:")
    print("  1. 检查数据库文件")
    print("  2. 创建/更新数据库表结构")
    print("  3. 初始化基础数据（分类、管理员）")
    print("  4. 创建测试数据（可选）")
    
    # 询问是否继续
    response = input("\n是否继续？(Y/n): ").strip().lower()
    if response and response != 'y':
        print("已取消")
        return
    
    # 步骤1: 检查数据库
    print_step(1, "检查数据库文件")
    db_exists = check_database_file()
    
    # 步骤2: 数据库迁移
    print_step(2, "数据库迁移")
    
    if not db_exists:
        print("数据库文件不存在，将创建新数据库")
    
    # 创建迁移文件
    if not create_migrations():
        print("\n✗ 数据库设置失败")
        return
    
    # 执行迁移
    if not run_migrations():
        print("\n✗ 数据库设置失败")
        return
    
    # 步骤3: 初始化基础数据
    print_step(3, "初始化基础数据")
    
    # 初始化分类
    if not init_kinds():
        print("\n✗ 初始化分类失败")
        return
    
    # 初始化管理员
    if not init_admin_user():
        print("\n✗ 初始化管理员失败")
        return
    
    # 步骤4: 创建测试数据（可选）
    print_step(4, "创建测试数据（可选）")
    response = input("是否创建测试用户和商家？(y/N): ").strip().lower()
    
    if response == 'y':
        create_test_users()
        create_test_stores()
    else:
        print("跳过创建测试数据")
    
    # 显示统计信息
    print_step(5, "完成")
    show_database_stats()
    
    print_header("数据库设置完成")
    print("\n您现在可以:")
    print("  1. 启动服务器: python manage.py runserver 0.0.0.0:8080")
    print("  2. 使用管理员账号登录:")
    print("     - 手机号: 13800138000")
    print("     - 密码: admin123")
    print("  3. 查看API文档了解所有可用接口")
    print("\n")


if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print("\n\n用户中断操作")
        sys.exit(0)
    except Exception as e:
        print(f"\n✗ 发生错误: {e}")
        import traceback
        traceback.print_exc()
        sys.exit(1)

